/*
 * Copyright 2013 University of Padua, Italy
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */



package it.unipd.dei.bd.icineasti.servlet.admin;

import it.unipd.dei.bd.icineasti.servlet.AbstractDatabaseServlet;

import it.unipd.dei.bd.icineasti.database.CreaOAggiornaEventoOFilmDatabase;
import it.unipd.dei.bd.icineasti.resource.Evento;

import java.io.IOException;
import java.io.PrintWriter;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.util.Iterator;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.apache.commons.fileupload.*;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;

/**
 * Permette l'aggiornamento della locandina di un evento mediante caricamento di un file JPEG dal browser.
 *
 * @author Coccato Mattia
 * @version 1.0 20130815
 */

public class UploadEventImageServlet extends AbstractDatabaseServlet {


	
	private static final String STATEMENT = "UPDATE Evento SET locandina = ? WHERE codice = ?";
	
	public void doPost(HttpServletRequest req, HttpServletResponse res)
			throws ServletException, IOException {

		res.setContentType("text/html");

		PrintWriter out = res.getWriter();

		String idAsString = null; 

		boolean isMultipart = ServletFileUpload.isMultipartContent(req);
		if (!isMultipart) {
			out.println("<html><head><title>errore</title></head><body>Formato risposta non corretto!</body></html>");
			return;	
		}
		
		
		FileItemFactory factory = new DiskFileItemFactory();
		ServletFileUpload upload = new ServletFileUpload(factory);
		
		//cerco i file caricati
		List<FileItem> items = null;
		
		try {
			items = upload.parseRequest(req);
		} catch (FileUploadException e) {
			e.printStackTrace();
			out.printf("<html><head><title>errore</title></head><body><p><center><font color=\"red\" size=\"+2\">Errore conversione parametro: %s</font></center></p></body></html>",
					e.getMessage());
			return;
		}
		
		
		FileItem file = null;
		
		//scorro le "parti" del mime-multipart response
		Iterator<FileItem> iter = items.iterator();
		while (iter.hasNext()) {
			FileItem item = iter.next();
			
			//devo controllare se è il file o il valore dell'idEvento
			if (item.isFormField()) {
				if (item.getFieldName().equals("idEvento"))
					idAsString = item.getString();
			} else 
				file = item; //è il campo file binario
		}
		
		if (idAsString == null) {
			out.println("<html><head><title>errore</title></head><body>Non è stato fornito l'idEvento!</body></html>");
			return;
		}

		int idEvento;

		try {
			idEvento = Integer.parseInt(idAsString);
		} catch (NumberFormatException e) {
			out.printf("<html><head><title>errore</title></head><body><p><center><font color=\"red\" size=\"+2\">Errore conversione parametro: %s</font></center></p></body></html>",
					e.getMessage());
			return;
		}
		
		try {
			Connection conn = DS.getConnection();

			byte[] immagine = file.get();
	
			if (!immagineJpegValida(immagine))
				throw new Exception ("Consentite solo immagini JPEG valide! Riprovare con un altro file.");


			new CreaOAggiornaEventoOFilmDatabase(conn, new Evento(idEvento, immagine, null, null, 0, 0)).aggiornaSoloLocandina();

			out.printf("<html><head><title>Gestione Locandina: OK</title></head><body onload=\"setTimeout(function() {window.close()},3000);\"><p class=\"ok\">Aggiornamento avvenuto con successo.<br /><a href=\"javascript:close()\">Chiudi</a></p></body></html>");

		} catch (Exception e) {
	
			out.printf("<html><head><title>Gestione Locandina: Errore</title></head><body><p><center><font color=\"red\" size=\"+2\">Errore generale: %s</font></center></p></body></html>",
					e.getMessage());
			return;
		}
	}

	private boolean immagineJpegValida(byte[] immagine) {
		/**
		  * @see http://en.wikipedia.org/wiki/Magic_number_(programming)
		  */

		return (immagine != null) && (immagine.length > 11)
				&& (((int)immagine[0] & 0xFF) == 0xFF) && (((int)immagine[1] & 0xFF) == 0xD8) && (((int)immagine[2] & 0xFF) == 0xFF) //immagini JPEG iniziano con 0xFFD8FF
				&& (((int)immagine[immagine.length - 2] & 0xFF) == 0xFF) &&  (((int)immagine[immagine.length - 1] & 0xFF) == 0xD9) //immagine JPEG finisce con 0xFFD9
				&& (((((int)immagine[6] & 0xFF) == 0x4A) && (((int)immagine[7] & 0xFF) == 0x46) && (((int)immagine[8] & 0xFF) == 0x49) && (((int)immagine[9] & 0xFF) == 0x46)) || //dal settimo carattere deve esserci scritto "JFIF" o
				    ((((int)immagine[6] & 0xFF) == 0x45) && (((int)immagine[7] & 0xFF) == 0x78) && (((int)immagine[8] & 0xFF) == 0x69) && (((int)immagine[9] & 0xFF) == 0x66)))	; //"Exif"
	}


}
